import sun.nio.cs.ext.GBK;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Array;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Locale;

public class TestDemo {
    public static void main1(String[] args) {
//        数组字符转字符串
        char[] val = {'a','b','c','d','e'};//单引号引起来的 不会入池
        String str1 = new String(val);//整体变字符串 abcde
        String str2 = new String(val,1,3);//一部分变字符串
        System.out.println(str1);
        System.out.println(str2);
        System.out.println("================");
        String str3 = "hello";
//        System.out.println(Arrays.toString(str3));报错 不可以打印字符串类型
        char ch = str3.charAt(2);//获取到2下标的字符
        System.out.println(ch);
        System.out.println("===================");
        char[] chars = str3.toCharArray();//把str3指向的字符串对象 变成字符数组
        System.out.println(Arrays.toString(chars));
    }


//    是否字符串全是由数字组成
    public static boolean isNumberChar(String str){
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
//          1.
//            if (ch<'0' || ch>'9'){
//                return false;
//            }
//          2.判断某个字符是不是数字
            boolean flg = Character.isDigit(ch);
            if (flg == false){
                return false;
            }
        }
        return true;
    }
    public static void main2(String[] args) {
        String str1 = "1234567";
        String str2 = "123asd";
        System.out.println(isNumberChar(str1));//true
        System.out.println(isNumberChar(str2));//false
    }
//       字符与字符串
    public static void main3(String[] args) throws UnsupportedEncodingException {
        byte[] bytes = {97,98,99,100,23};
        String str1 = new String(bytes);
        System.out.println(str1);//abcd
        String str2 = new String(bytes,1,3);
        System.out.println(str2);//bcd
        System.out.println("=============");
        String str3 = "hello";
        byte[] bytes1 = str3.getBytes();
        System.out.println(bytes1);//[B@1b6d3586
        System.out.println(Arrays.toString(bytes1));//[104, 101, 108, 108, 111]
        System.out.println("===============");
        String str4 = "acb";
        byte[] bytes4 = str4.getBytes("utf-8");//[97, 99, 98]
        System.out.println(Arrays.toString(bytes4));
        byte[] bytes41 = str4.getBytes("GBK");
        System.out.println(Arrays.toString(bytes41));//[97, 99, 98]
        System.out.println("=======================");
        String str5 = "猫哥";//一个中文 两个字节
        byte[] bytes5 = str5.getBytes("utf-8");//[-25, -116, -85, -27, -109, -91]
        System.out.println(Arrays.toString(bytes5));
        byte[] bytes51 = str5.getBytes("GBK");
        System.out.println(Arrays.toString(bytes51));//[-61, -88, -72, -25]
    }


//    字符串常见操作
//    1.字符串比较
    public static void main4(String[] args) {
        String str1 = "asd";
        String str2 = "hello";
//        alt+鼠标左键 查看比较时equals的源码
//        equals 比较顺序 地址-类型-长度-每位字符
        System.out.println(str1.equals(str2));//false
        String str3 = str1;
        System.out.println(str1.equals(str3));//true
        String str4 = "ASD";
        System.out.println(str1.equalsIgnoreCase(str4));//true  忽略大小写
    }

//          字符串查找
//    compareTo alt+鼠标左键 查看比较时compareTo的源码
//    如果长度不同 前面短的字符串是长的字符串的子串  那么返回的是负数(长度的差)
    public static void main5(String[] args) {
        String str1 = "asd";//小写a的ASCII是97
        String str2 = "Asd";//小写A的ASCII是65
        int ret = str1.compareTo(str2);
        System.out.println(ret);//32
        String str3 = "asd";
        int ret1 = str1.compareTo(str3);
        System.out.println(ret1);//0
        String str4 = "asdas";
        int ret2 = str1.compareTo(str4);
        System.out.println(ret2);//-2
        System.out.println("=========================");
        System.out.println("猫".compareTo("狗"));//84
        System.out.println("AB".compareTo("AC"));//-1
        System.out.println("A".compareTo("A"));//0
        System.out.println("A".compareTo("a"));//-32
    }


//          字符串查找
    public static void main6(String[] args) {
        String str1 = "abaabcsabcd";
        String str2 = "abc";
        boolean flg = str1.contains(str2);
        System.out.println(flg);//true
        int index = str1.indexOf(str2);// 类似于C的strstr --KMP算法
        System.out.println(index);//3
        int index1 = str1.indexOf(str2,5);//5号位置开始找
        System.out.println(index1);//7
        int index2 = str1.lastIndexOf(str2);//后往前找
        System.out.println(index2);//7
        //从指定位置由后先前查找
        System.out.println(str1.lastIndexOf(str2,7));//7
        System.out.println("==================");
        System.out.println(str1.startsWith("ab"));//是否是ab开头的 true
        System.out.println(str1.startsWith("abc"));//是否是abc开头的 false
        System.out.println(str1.startsWith("ab",3));//下标3开始是否是ab开头的 true
        System.out.println(str1.endsWith("cd"));//是否以cd结尾 true
    }

//      字符串替换
    public static void main7(String[] args) {
        String str1 = "ababcabcde";
        str1 = str1.replace('a','g');// 将a替换成g(本质改变str1的指向)
        System.out.println(str1);//gbgbcgbcde
        String str2 = "ababcabcde";
        System.out.println(str2);
        String ret = str2.replace("ab","qwe");
        System.out.println(ret);//qweqwecqwecde  所有的ab都替换成了qwe
        String ret1 = str2.replaceAll("ab","qwe");
        System.out.println(ret1);//qweqwecqwecde  所有的ab都替换成了qwe
        System.out.println(str2.replaceFirst("ab", "hello"));//helloabcabcded第一个ab替换成hello
    }

///     字符串拆分
    public static void main8(String[] args) {
        String str1 = "name=cat and big&age=12&age=18";
        String[] strings1 = str1.split("&");//返回一个String数组
//        1.分割&
        for (String s:strings1) {
            System.out.println(s);
//            打印结果
//            name=cat and big
//            age=12
//            age=18
        }
        System.out.println("====================");
//        2.分割&   和   =
        for (String s:strings1) {
            String[] ss = s.split("=");
            for (String tmp:ss) {
                System.out.println(tmp);
//              打印结果
//                name
//                cat and big
//                age
//                12
//                age
//                18
            }
        }
    }
//      注意点
//    如果是这样 192\168\1\1  斜杆会和它后面数字组成转义字符 \16   \1   \1
//    .split("\\\\"); 引用\
//    我们得写成这样192\\168\\1\\1
//    如果是反斜杠可以直接使用 .split("/");
    public static void main9(String[] args) {
        String str1 = "192.168.1.1";
//        String[] strings = str1.split(".");
//        for (String s :
//                strings) {
//            System.out.println(s);
//        }
//        发现什么都没有打印 .号这个字符比较特殊
//        想要识别.号 需要给它转义 \. 但是这样还是会报错 因为识别\也需要转义
//        所以 我们应该这样写  "\\."        还有"|"  "*"   "+"等这些字符
        String[] strings = str1.split("\\.");
        for (String s :
                strings) {
            System.out.println(s);
//          打印结果
//            192
//            168
//            1
//            1
        }
        System.out.println("================");
        String[] strings1 = str1.split("\\.", 2); //表示分几组 这里是分两组
//        如果超过分的组数  它按最大点数分（如果limit：10）那么还是分4组
        for (String s :
                strings1) {
            System.out.println(s);
//          打印结果
//            192
//            168.1.1
        }
    }

//      一个字符串多个分隔符
    public static void main10(String[] args) {
        String str1 = "Java 12&21#hello*world";
        String[] strings = str1.split(" |&|#|\\*");
        for (String s :
                strings) {
            System.out.println(s);
//          打印结果
//            Java
//            12
//            21
//            hello
//            world
        }
    }



//    字符串截取
//    可以alt+鼠标左键查看substring源码
    public static void main11(String[] args) {
        String str1 = "abcdefg";
        String sub1 = str1.substring(2);//提取自串
        System.out.println(sub1);//cdefg
        String sub2 = str1.substring(0);//提取自串 如果为0 不会产生新的对象
        System.out.println(sub2);//abcdefg
        System.out.println(str1 == sub2);//ture
        System.out.println(str1.substring(2,4));//cd  左闭右开
    }

//    其他常用字符串方法
//    去两边空格
    public static void main12(String[] args) {
        String str1 = "      abc     de    fg     ";
        System.out.print(str1.trim());
        System.out.println("========");//abc     de    fg========
//        去除字符串左右两边的空格
    }

//    字符串大小写
    public static void main13(String[] args) {
        String str1 = "abcDeFGhiJ";
        System.out.println(str1.toUpperCase());//ABCDEFGHIJ
        System.out.println(str1.toLowerCase());//abcdefghij
    }

//    拼接
    public static void main14(String[] args) {
        String str1 = "abcde";
        String str2 = str1.concat("hello");
        System.out.println(str2);//abcdehello   拼接的结果不入常量池
        System.out.println(str1.isEmpty());//false   字符串是否为空
        String str3 = "";
        System.out.println(str3.isEmpty());//true


        System.out.println("===========");
        System.out.println(str1.length());//length()方法
        int[] arr = {12,23,34,54};
        System.out.println(arr.length);//length是数组的属性
//        java 里面的数组非常特殊 机制很多
    }









//             StringBuilder     和    StringBuffer

    public static void main15(String[] args) {
//        1.
        StringBuilder sb = new StringBuilder("hello");//返回值是 String
        System.out.println(sb);//hello
//        2.
        StringBuilder sb1 = new StringBuilder();
        sb1.append("world");
        sb1.append(" hello");//拼接上去 不会产生新的对象
        System.out.println(sb1.toString());//world hello    这两种方式都可以打印

        StringBuilder sb2 = new StringBuilder();
        sb2.append("hello").append(" cat");  //append 可以连用
        System.out.println(sb2);// hello cat

    }





}
